home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgramD2.iso / Borland / Borland C++ V5.02 / CRIBBAGE.PAK / CARDS.CPP < prev    next >
C/C++ Source or Header  |  1997-05-06  |  4KB  |  187 lines

  1. //--------------------------------------------------------------------------
  2. // Turbo Cribbage -- Copyright (c) 1995, Borland International
  3. //--------------------------------------------------------------------------
  4. #include <owl/pch.h>
  5. #include "cards.h"
  6.  
  7. char *TCard::rankStr[14] = { "0","A","2","3","4","5","6",
  8.                              "7","8","9","10","J","Q","K" };
  9. char *TCard::suitStr[4] = { "C","D","H","S" };
  10.  
  11. char TCard::buffer[10];
  12.  
  13. TCardGroup::TCardGroup(int aMaxCards) {
  14.   maxCards = aMaxCards;
  15.   count = 0;
  16.   cards = new TCard*[maxCards];
  17.   for (int i=0;i<maxCards;i++)
  18.     cards[i]=0;
  19. }
  20.  
  21. TCardGroup::~TCardGroup() {
  22.   for (int i=0;i<count;i++)
  23.     delete cards[i];
  24.   delete [] cards;
  25. }
  26.  
  27. int TCardGroup::Insert(TCard* card) {
  28.   assert(count<maxCards);
  29.   assert(card!=0);
  30.   cards[count++] = card;
  31.   return (count-1);
  32. }
  33.  
  34. void TCardGroup::Insert(TCardGroup* cardGroup) {
  35.   TCard *temp;
  36.   do {
  37.     temp = cardGroup->Remove(0);
  38.     if (temp)
  39.       Insert(temp);
  40.   } while (temp);
  41. }
  42.  
  43. TCard* TCardGroup::Remove(int position) {
  44.   int i;
  45.  
  46.   if (count==0)
  47.     return 0;
  48.  
  49.   TCard *temp = cards[position];
  50.   for (i=position+1;i<count;i++)
  51.     cards[i-1]=cards[i];
  52.   cards[count-1]=0;
  53.   count--;
  54.   return temp;
  55. }
  56.  
  57. const TCard& TCardGroup::operator[](int position) {
  58.   assert((position>=0) && (position<GetCount()));
  59.   return *cards[position];
  60. }
  61.  
  62. TCard* TDeck::DealCard() {
  63.   return Remove();
  64. }
  65.  
  66. TDeck::TDeck(int backStyle): TCardGroup(52) {
  67.   Initialize(backStyle);
  68. }
  69.  
  70. void TDeck::Initialize(int backStyle) {
  71.   int suit,value;
  72.  
  73.   while (Remove()!=0);
  74.  
  75.   for (suit=0;suit<4;suit++)
  76.     for (value=1;value<=13;value++)
  77.       Insert(new TCard(value, suit, backStyle, false));
  78. }
  79.  
  80. void TDeck::Shuffle(int shuffleCount) {
  81.   TCard *temp[52];  // temporarily hold the cards here
  82.   int i,j,k,splitPos;
  83.   int count = GetCount();
  84.  
  85.   assert(count==GetMaxCards());        // shuffle only works on a full deck
  86.  
  87.   while (shuffleCount>0) {
  88.     for (i=0;i<count;i++)
  89.       temp[i] = cards[i];
  90.     i=0;
  91.     splitPos = count/2+random(10)-5;
  92.     j = splitPos;
  93.     k=0;
  94.     while ((i<splitPos)&&(j<count)) {
  95.       if (random(2))
  96.         cards[k++]=temp[i++];
  97.       else
  98.         cards[k++]=temp[j++];
  99.     }
  100.     while (i<splitPos)
  101.       cards[k++]=temp[i++];
  102.     while (j<count)
  103.       cards[k++]=temp[j++];
  104.     shuffleCount--;
  105.   }
  106. }
  107.  
  108. void TDeck::Cut(int cutPosition) {
  109.   TCard *temp[52];
  110.   int i,count = GetCount();
  111.   int check[52];
  112.   char tempstr[30];
  113.  
  114.   assert(cutPosition < count);
  115.  
  116.   wsprintf(tempstr,"cutpos = %d, deck size = %d",cutPosition,count);
  117.   ::MessageBox(0,tempstr,"info",MB_OK);
  118.  
  119.   for (i=0;i<52;i++) {
  120.     temp[i]=0;
  121.     check[i]=0;
  122.   }
  123.  
  124.   for (i=0;i<count;i++) {
  125.     temp[i]=cards[i];
  126.     check[cards[i]->suit*13+cards[i]->rank-1]++;
  127.   }
  128.  
  129.   for (i=cutPosition+1;i<count;i++)
  130.     cards[i-(cutPosition+1)]=temp[i];
  131.   for (i=0;i<=cutPosition;i++)
  132.     cards[cutPosition+i+1]=temp[i];
  133.  
  134.   for (i=0;i<count;i++) {
  135.     check[cards[i]->suit*13+cards[i]->rank-1]--;
  136.   }
  137.  
  138.   for (i=0;i<52;i++)
  139.     if (check[i]!=0)
  140.       ::MessageBox(0, "Cut failed.","Error",MB_OK);
  141. }
  142.  
  143. void TDeck::ResetBackStyle(int newBackStyle) {
  144.   int i,count = GetMaxCards();
  145.   for (i=0;i<count;i++)
  146.     cards[i]->backStyle = newBackStyle;
  147. }
  148.  
  149. const char *TDeck::EncodeDeck() {
  150.   static char encodedDeck[53];
  151.  
  152.   int temp,i;
  153.  
  154.   for (i=0;i<52;i++) {
  155.     temp = cards[i]->rank | (cards[i]->suit<<4);
  156.     encodedDeck[i] = char(temp+'0');
  157.   }
  158.   encodedDeck[52]=0;
  159.   return encodedDeck;
  160. }
  161.  
  162. BOOL TDeck::DecodeDeck(const char *encodedDeck) {
  163.   int rank,suit,i,j,temp;
  164.   int check[4][13];              // used to validate deck
  165.  
  166.   for (i=0;i<4;i++)
  167.     for (j=0;j<13;j++)
  168.       check[i][j]=0;
  169.  
  170.   for (i=0;i<52;i++) {
  171.     temp = encodedDeck[i]-'0';
  172.     rank = temp & 0x0f;
  173.     suit = temp >> 4;
  174.     check[suit][rank-1]++;
  175.     cards[i]->rank = rank;
  176.     cards[i]->suit = suit;
  177.   }
  178.  
  179.   for (i=0;i<4;i++)              // make sure we have 1 of each card
  180.     for (j=0;j<13;j++)
  181.       if (check[i][j]!=1)
  182.         return false;            // if not, return
  183.   return true;
  184. }
  185.  
  186.  
  187.